import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

/**
 * Created by xiebang
 * Description
 * User:小谢
 * Date:2021-09-16
 * Time:19:13
 */
public class TestDemo {
    public static void main1(String[] args) {
        //三种创建字符串的方法
        String str1 = "hellobit";//字符串的字面类型----字符串常量值（存储的就是字符串）什么叫做池？数据库连接池 线程池
        //Stringpool->哈希表。jvm是c++实现的
        String str2 = new String("hellobit");
        char[] chars = {'a', 'b', 'c'};
        String str3 = new String(chars);
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
    }

    public static void main2(String[] args) {
        String str1 = "hellobit";//字符串的字面类型
        String str2 = new String("hellobit");
        System.out.println(str1 == str2);//比较引用的值是否相同
        System.out.println(str1.equals(str2));

        //str1指向常量池里的
        //str2 指向堆里的。堆来自常量池

    }

    public static void main3(String[] args) {
        String str1 = "gaobo";
        String str2 = "gao" + "bo";//程序编译的时候会自动拼接为“gaobo”
        //常量在编译的时候已经被运算了。
        System.out.println(str1 == str2);//结果为ture;
        final int a = 10;
        final int b = 20;
        final int c = a + b;
        System.out.println(c);
    }

    public static void main4(String[] args) {
        String str1 = "gaobo";
//        final String str2 = "gao";//true
        String str2 = "gao";//false
        String str3 = str2 + "bo";

        System.out.println(str1 == str3);
    }

    public static void main5(String[] args) {
        String str1 = "gaobo";
        String str4 = "gao" + new String("bo");//false
        System.out.println(str1 == str4);
    }

    public static void main6(String[] args) {
        String str1 = "gaobo";
        String str5 = new String("gao") + new String("bo");
        System.out.println(str1 == str5);
    }

    public static void main7(String[] args) {
        //String str1 = "gaobo";
        String str2 = new String("gaobo");
        str2.intern();                                 //手动将字符串入池//有就不放进去了
        String str1 = "gaobo";
        System.out.println(str1 == str2);//所以结果也是false
    }

    public static void main8(String[] args) {
        String s3 = new String("1") + new String("1");
        s3.intern();
        String s4 = "11";
        System.out.println(s3 == s4);//true
    }

    public static void main9(String[] args) {
        String s3 = new String("1") + new String("1");
        String s4 = "11";
        s3.intern();
        System.out.println(s3 == s4);//false

    }

    public static void main10(String[] args) {
        String str1 = "hello";
        String str2 = str1;
        str1 = "word";
        System.out.println(str1 == str2);//不相等 str1改变不会改变str2
    }

    //String 用==比较的不是内容而是使用
    public static void main11(String[] args) {
        String str1 = null;
        String str2 = "hello";
//        System.out.println(str1.equals(str2));//会空指针异常
        System.out.println(str2.equals(str1));
    }

    //理解字符串不可变
    public static void main12(String[] args) {
        String str = "hello";//不可变的 所以是在常量池中有 三个字符串
        str = str + "world";
        str += "!!!";
        System.out.println(str);
    }

    //“hello”没有被引用会不会被回收？
    public static void main13(String[] args) {
        String str = "Hello";
        str = "h" + str.substring(1);//提取子串  这种改法产生了一个新的对象，并没有原来的Hello上把H该为h
        System.out.println(str);
    }

//    public static void main(String[] args) {
//        //当然是可以的，但是需要用到反射。
//        //反射：java类的一种自省的方式 。通常情况下：类的内部细节，有时候在类外是看不到的，但是通过反射能看到。
//
//        String str = "hello";
//
//        Class c = String.class;
//
//        Field field = c.getDeclaredField("value");
//        field.setAccessible(true);
//        char[] vals = (char[]) field.get(str);
//
//    }
        public static void main14(String[] args) {
            String str = "hello";
            for (int x = 0; x < 10; x++) {
                str += x;//不可以这样写。
            }
            System.out.println(str);
        }
//字符与字符串
    public static void main15(String[] args) {
        char[] value = {'a','b','c','d','e'};
        String str = new String(value,1,2);//offset偏移量为1，取两个数//bc从偏移量为1的位置开始取两个字符来构造String对象
        System.out.println(str);
        System.out.println("=============================");
        String str2 = "hello";
        char ch = str2.charAt(1);//去1位置的字符
        System.out.println(ch);

        System.out.println("===================================");

        String str3 ="hello";
        char[] chars =str.toCharArray();//将字符串以字符数组的方式进行存储
        System.out.println(Arrays.toString(chars));
    }


    public static boolean isNumber(String str){
        if (str == null) return false;
        if (str.length() == 0) return false;
        char[] chars = str.toCharArray();
        for (char ch : chars){
            if (ch < '0' || ch > '9'){
                return false;
            }
        }
        return true;
    }

    public static void main16(String[] args) {
        String str = "123456";
//        char[] chars = str.toCharArray();
//            if (ch < '0' || ch > '9'){
//                System.out.println("不全是字符");
//                return;
//            }
//        }
        System.out.println("全是字符");
    }

    public static void main17(String[] args) {
        byte[] bytes = {97,98,99,100};
        String str = new String(bytes);
        System.out.println(str);
    }

    public static void main(String[] args) {
        String str = "abcdef";
        byte[] bytes = str.getBytes("UTF-8");
        System.out.println(Arrays.toString(bytes));
    }
}